package cn.mesmile.juc.atomic;

import com.sun.org.apache.xerces.internal.dom.PSVIAttrNSImpl;
import sun.misc.PostVMInitHook;

import java.util.HashMap;
import java.util.Objects;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author zb
 * @date 2021/11/13 16:04
 * @Description
 */
public class AtomicTest {

    /**
     *  并发编程三要素: 原子性、可见性、顺序性
     *
     *  原子性:一个不可再被分割的颗粒，原子性指的是一个或多个操作要么全部执行成功要么全部执行失败，
     *      期间不能被中断，也不存在上下文切换，线程切换会带来原子性的问题
     * ​
     *  int num = 1; // 原子操作
     *      num++; // 非原子操作，从主内存读取num到线程工作内存，进行 +1，再把num写到主内存, 除非用原子类，
     *      即java.util.concurrent.atomic里的原子变量类
     *
     *   有序性: 程序执行的顺序按照代码的先后顺序执行，因为处理器可能会对指令进行重排序
     *
     *   可见性: 一个线程A对共享变量的修改,另一个线程B能够立刻看到
     *
     *   synchronized、lock和volatile能够保证线程可见性
     *
     * @param args
     */
    public static void main(String[] args) {
        new HashMap<>();
        AtomicInteger atomicInteger = new AtomicInteger(0);
        for (int i = 0; i < 6 ; i++) {
            // 加1之后再返回结果
            int value = atomicInteger.incrementAndGet();
            System.out.println("value = " + value);
        }
    }
}
